package com.sy.api;
import com.sy.ResultVO;
import com.sy.config.MinIOConfig;
import com.sy.utils.MinIOUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.UUID;
/**
 * @className: FileController
 * @author: Mr.Liu
 * @date: 2025/11/4 10:05
 * @Version: 1.0
 * @description:
 */
@RestController
@RequestMapping("/file")
@Tag(name = "文件上传" ,description = "课程图片及小节视频上传")
public class FileController {
    @Resource
    private MinIOConfig minIOConfig;
    /**
     * @Description:上传文件
     * @author: MrL.BH
     * @date: 2025/6/10 23:42
     * @param:file 前端传递过来的上传文件信息
     * @return:GraceJSONResult
     **/
    @PostMapping("/uploadImage")
    @Operation(summary = "图片上传")
    public ResultVO<Object> uploadImage(@RequestParam("file") MultipartFile file) throws Exception {

        // 获得文件原始名称  //  demo.mp4
        String filename = file.getOriginalFilename();
        //判断获取文件名是否是null ""  " " ,
        if (StringUtils.isBlank(filename)) {
            //如果是null，返回相应的错误信息
            return ResultVO.error("文件名为空");
        }
        //如果获取的文件名不是null,给文件设置在Minio的存储位置
        // course/ 相当于在对应的Minio的桶中创建一个文件夹叫course
        //文件就上传到这个桶的这个文件夹下
        filename = "course/" + dealWithoutFilename(filename);
        //开始上传到指定的Minio桶
        String imageUrl = MinIOUtils.uploadFile(minIOConfig.getBucketName(),
                filename,
                file.getInputStream(),
                true);

        return ResultVO.success(imageUrl);
    }
    @PostMapping("/uploadVideo")
    @Operation(summary = "视频上传")
    public ResultVO<Object> uploadVideo(@RequestParam("file") MultipartFile file) throws Exception {

        // 获得文件原始名称  //  demo.mp4
        String filename = file.getOriginalFilename();
        //判断获取文件名是否是null ""  " " ,
        if (StringUtils.isBlank(filename)) {
            //如果是null，返回相应的错误信息
            return ResultVO.error("文件名为空");
        }
        //如果获取的文件名不是null,给文件设置在Minio的存储位置
        // course/ 相当于在对应的Minio的桶中创建一个文件夹叫course
        //文件就上传到这个桶的这个文件夹下
        filename = "sections/" + dealWithoutFilename(filename);
        //开始上传到指定的Minio桶
        String imageUrl = MinIOUtils.uploadFile(minIOConfig.getBucketName(),
                filename,
                file.getInputStream(),
                true);

        return ResultVO.success(imageUrl);
    }

    /**
     * @Description:加原始名字的文件重命名
     * @author: MrL.BH
     * @date: 2025/6/10 23:46
     * @param: filename 原始文件名
     * @return: String 重命名后的文件名
     * *
     **/
    private String dealWithFilename(String filename) {
        //获取文件后缀
        String suffixName = filename.substring(filename.lastIndexOf("."));
        //获取文件名称
        String fName = filename.substring(0, filename.lastIndexOf("."));
        //获取一个随机值
        String uuid = UUID.randomUUID().toString();
        //重命名文件，防止上传的时候文件名重复而产生覆盖
        return fName + "-" + uuid + suffixName;
    }
    /**
     * @Description:不加原始文件名的文件重命名
     * @author: MrL.BH
     * @date: 2025/6/10 23:47
     * @param:filename原始文件名
     * @return: String 重命名后的文件名
     **/
    private String dealWithoutFilename(String filename) {
        //获取文件名
        String suffixName = filename.substring(filename.lastIndexOf("."));
        //获取一个随机值
        String uuid = UUID.randomUUID().toString();
        //重命名文件，防止上传的时候文件名重复而产生覆盖
        return uuid + suffixName;
    }

}
